
#ifndef LOGIN_HPP
#define	LOGIN_HPP



#include <iostream>
#include <conio.h>

#include "uniofwork.hpp"
#include "utilities.hpp"

using namespace lms::dataaccess;
using namespace lms::unitofwork;
using lms::utilities::Utilities;

bool authenticate(User* user) {
    UnitOfWork& unit = UnitOfWork::getInstance();
    GenericRepository< lms::entities::User >* repository = unit.getUserRepository();

    //  
    //   
    //   User* u =  new User("Admin","123","");
    //   
    //   repository->add( u );
    LinkedList< lms::entities::User >* users = repository->get();

    Node< lms::entities::User >* first = users->getFirst();
    while (first != NULL) {

        User* restrievedUser = first->getData();
        if (*restrievedUser == *user)
            return true;
        first = first->getNext();
    }

    return false;
}

void drawLineDivider() {
    Utilities::clearScreen();
    Utilities::printText("\t\t\tBienvenido al sistema de Libreria");
    Utilities::printText("\n");
    Utilities::printText("--------------------------------------------------------------------------------\n");
    Utilities::printText("\n\n\n");
}

bool login() {

    drawLineDivider();

    std::string name;
    std::string password;
    bool isAcceptableInput = false; //flag para determinar si seguir pidiendo {Usuario} 0 { Contrasena } al usuario.
                                    //Es decir mientras no se teclee nada el va a seguir pidiendo informacion al usuario.


    while (!isAcceptableInput) {
        char ch;                        //Variable para ir almacenando cada caracter que se teclea.
        std::cout<<"\tUsuario     >> ";
        while ((ch = getch()) != '\r') { // Mientras no se le de a enter, va a ir imprimiendo la letra que se tecleo
            printf("%c", ch);

            if (ch == ' ')
                continue;
            name.append(1, ch);
            if (name.size() == 0)
                continue;
            else
                isAcceptableInput = true;
        }
        Utilities::printText("\n");
    }

    while (isAcceptableInput) {
        char ch;                        //Variable para ir almacenando cada caracter que se teclea, para sustituirla por el caracter *
        std::cout<<"\tContrasena  >> ";
        while ((ch = getch()) != '\r') { // Mientras no se le de a enter, va a ir imprimiendo la letra que se tecleo, y se sustitiye po un *
            printf("%c", '*');

            if (ch == ' ')
                continue;
            password.append(1, ch);     //Aqui se va almacenando la contrasena
            if (password.size() == 0)
                continue;
            else
                isAcceptableInput = false;
        }
        Utilities::printText("\n");

    }
    Utilities::printText("\n");


    User* userLogged = new User(name, password, "");

    if (!authenticate(userLogged)) {
        std::cout << " Incorrect User: " << name << " O Incorrect Password" << std::endl;
        Utilities::printText("\n");
        Utilities::pause();
        return false;
    }
    return true;


}


#endif	/* LOGIN_HPP */

